home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #11 / Amiga Plus CD - 2004 - No. 11.iso / AmiSoft / Dev / misc / temgen.lha / Temgen / tg-0.11 / strbuf.c < prev    next >
C/C++ Source or Header  |  2002-12-18  |  2KB  |  83 lines

  1. #include "alloc.h"
  2. #include "sysdefs.h"
  3.  
  4. struct strbuf {
  5.         char    *data;
  6.         unsigned size, len, delta;
  7. };
  8.  
  9. struct strbuf *new_strbuf( unsigned size, unsigned delta )
  10. {
  11.         struct strbuf *b;
  12.  
  13.         b = (struct strbuf*)MALLOC( sizeof(*b) );
  14.         if ( b ) {
  15.                 b->data = size ? (char*)MALLOC( size ): NULL;
  16.                 if ( size && !b->data ) {
  17.                         FREE( b );
  18.                         return NULL;
  19.                 }
  20.  
  21.                 b->size = size;
  22.                 b->data[ 0 ] = '\0';
  23.                 b->len = 0;
  24.                 b->delta = delta;
  25.         }
  26.  
  27.         return b;
  28. }
  29.  
  30. void free_strbuf( struct strbuf *b )
  31. {
  32.         if ( b ) {
  33.                 if ( b->data ) FREE( b->data );
  34.                 FREE( b );
  35.         }
  36. }
  37.  
  38. const char *sb_data( struct strbuf *b )
  39. {
  40.         return b ? b->data: NULL;
  41. }
  42.  
  43. int sb_cat( struct strbuf *b, const char *s, unsigned n )
  44. {
  45.         unsigned len;
  46.         if ( !b ) return -1;
  47.  
  48.         len = s ? strlen(s): 0;
  49.         if ( n < len ) len = n;
  50.         
  51.         while( b->size < b->len + len + 1 ) {
  52.                 char *old;
  53.                 if ( b->delta <= 0 ) return -1;
  54.                 b->size += b->delta;
  55.                 old = b->data;
  56.                 b->data = (char*)REALLOC( b->data, b->size );
  57.                 if ( !b->data ) {
  58.                         b->data = old;
  59.                         b->size -= b->delta;
  60.                         return -1;
  61.                 }
  62.                 else memset( b->data+b->size-b->delta, 0, b->delta );
  63.         }
  64.  
  65.         strncat( b->data, s, len );
  66.         b->len += len;
  67.         return 0;
  68. }
  69.  
  70. void sb_clear( struct strbuf *sb )
  71. {
  72.         if ( sb && sb->data ) {
  73.                 sb->data[ 0 ] = '\0';
  74.                 sb->len = 0;
  75.  
  76.                 if ( sb->delta && sb->size > 8*sb->delta ) {
  77.                         FREE( sb->data );
  78.                         sb->size = sb->len = 0;
  79.                         sb->data = NULL;
  80.                 }
  81.         }
  82. }
  83.